#! /bin/sh
#
# $OpenBSD: check-license,v 1.5 2003/06/12 22:30:28 marc Exp $
#
# PUBLIC DOMAIN -- Marco S Hyman -- <marc@snafu.org>
#
# This script verifies that all files in a given directory are
# mentioned in the ports LICENSE file as Distribution allowed.
# Output is three lists:
#
#  Missing files:	files that should be in the directory (if the
#			intent is to obtain all files that can be
#			re-distributed) but are not.
#
#  Bad files:		files that must NOT be in a distribution
#			directory.  These are listed in the form
#			of a shell `mv -f xxx ../licensed' command so
#			they can be fed to the shell (after manual
#			verification) to move them into a directory
#			that will not be copied to any CD-ROM.
#
#  Unknown files:	files that are noted in the LICENSE file but
#			do not have a distribution flag of either Y or N.
#
#  Extra files:		Files that are in the given directory that are
#			not mentioned in the ports LICENSE file.
#

# The ports base directory.  Note: this may be supplied from the environment
# using the standard bsd.port.mk name of PORTSDIR
#
LICENCE=${PORTSDIR:-/usr/ports}/LICENSE

# Our name and a function to spit out the usage.  Exit.
#
prog=`basename $0`
usage () {
    if [ ! -z "$1" ]; then
	echo "$prog: $1"
    fi
    echo "usage: $prog distribution-directory"
    exit 1
}

# Verify we have one param and that it is the name of a directory.
# If not spit out our usage and exit
#
if [ $# -eq 1 ]; then
    if [ -d $1 ]; then
	DIST=$1
    else
	usage "$1 is not a directory"
    fi
else
    usage
fi

# This awk script matches the license file against an `ls' of the given
# distribution directory and spits instructions out to stdout.
#
/bin/ls $DIST |
awk -v L=$LICENCE '
BEGIN {
    # Process license file
    #
    while ( getline <L ) {
	if ( NF == 4 ) {
	    if ( $1 == "Y" ) {
		good_files[ $3 ] = 0
	    } else if ( $1 == "N" ) {
		bad_files[ $3 ] = 0
	    } else {
	        unk_files[ $3 ] = 0
	    }
	}
    }
    extra_count = 0
}

$1 in good_files {
    good_files[ $1 ] = 1
    next
}
$1 in bad_files {
    bad_files[ $1 ] = 1
    next
}
$1 in unk_files {
    unk_files[ $1 ] = 1
    next
}
{
    extra_files[ extra_count++ ] = $1
}

END {
    header = 0
    for ( f in good_files ) {
	if ( good_files[ f ] == 0 ) {
	    if ( ! header ) {
		print "You are missing the following files:"
		print
		header = 1
	    }
	    print f
	}
    }
    for ( f in unk_files ) {
	if ( unk_files[ f ] == 0 ) {
	    if ( ! header ) {
		print "You are missing the following files:"
		print
		header = 1
	    }
	    print f
	}
    }
    if ( header ) {
	print
	header = 0
    }
    for ( f in bad_files ) {
	if ( bad_files[ f ] == 1 ) {
	    if ( ! header ) {
		print "You MUST move the following files/directories:"
		print
		header = 1
	    }
	    print "/bin/mv -f", f, "../licensed"
	}
    }
    if ( header ) {
	print
	header = 0
    }
    for ( f in unk_files ) {
	if ( unk_files[ f ] == 1 ) {
	    if ( ! header ) {
		print "The status of the following files is unknown:"
		print
		header = 1
	    }
	    print f
	}
    }
    if ( header ) {
	print
	header = 0
    }

    if ( extra_count > 0 ) {
	print "The following files/dirs are extra and " \
	      "should probably be removed:"
	print
	for ( i = 0; i < extra_count; i += 1 ) {
	    print "/bin/rm -rf", extra_files[ i ]
	}
	print
    }
}
' 
exit 0
